from flask import Flask, current_app

app = Flask(__name__)
# 实例化应用上下文对象
# ctx = app.app_context()
# 应用上下文对象入栈
# ctx.push()
# 通过代理获取到应用对象
# a = current_app
# b = current_app.config['DEBUG']
# 应用上下文对象出栈
# ctx.pop()

# 上下文管理器：实现了上下文协议的对象称为上下文管理器，只要对象中实现了__enter__和__exit__两个方法即实现了上下文协议
# 上下文表达式：with语句后面的表达式称为上下文表达式，上下文表达式必须返回一个上下文管理器
# 使用with语句的前提：实现了上下文协议的对象（上下文管理器）
# with应用场景：
# 例如数据库操作：连接数据库，执行sql，释放数据库连接（资源）
# 在执行过程中出现异常导致未释放资源的解决方案：
# 方案1：使用try...except...finally
# 方案2：使用上下文管理器，将连接数据库的代码写在__enter__方法中，将执行sql的代码写在with语句块中，将释放资源的代码写在__exit__方法中
with app.app_context():
    a = current_app
    b = current_app.config['DEBUG']
